package juego;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import ar.uba.fi.algo3.titiritero.Posicionable;


public abstract class Ubicable implements Posicionable, Persistible{
	
	//atributos de instancia
	protected Coordenada ubicacion;
	//atributos de instancia	
	protected boolean vivo;
	
	//metodos
	
	//constructor
	public Ubicable (int x , int y){
		ubicacion = new Coordenada(x,y);
		this.vivo = true;	
	};
	
	//retorna la ubicacion
	public Coordenada verUbicacion(){
		return this.ubicacion;
	};
	
	public abstract int verTamanio();
	
	//devuelve true si hubo contacto
	//si tiene que cotejarse consigo mismo, lanza una ExcepcionMismoElemento
	public boolean huboContacto (Ubicable otroUbicable){
		
		if (this == otroUbicable){
			throw new ExcepcionMismoElemento();
		};
		int distancia = this.getCentro().distancia(otroUbicable.getCentro());
		//int distancia = this.ubicacion.distancia(otroUbicable.verUbicacion());
		int sumaTamanios = (this.verTamanio() + otroUbicable.verTamanio());
		return (distancia <= sumaTamanios); 
	};
	
	public int getX(){
		return this.ubicacion.obtenerCoordenadaX();
	}
	
	public int getY(){
		return this.ubicacion.obtenerCoordenadaY();
	}
	
	public boolean estaVivo(){
		return this.vivo;
	};
	
	public Coordenada getCentro(){
		int enX = this.ubicacion.obtenerCoordenadaX();
		int enY = this.ubicacion.obtenerCoordenadaY();
		enX += this.verTamanio();
		enY += this.verTamanio();
		Coordenada centro = new Coordenada(enX,enY);
		return centro;
	}
	
	private void persistirUbicacion(Document doc, Element elemento) {
		Element ubicacion = this.ubicacion.getElement(doc);
		elemento.appendChild(ubicacion);
	}
	
	private void persistirVivo(Document doc, Element elemento) {
		Boolean valorVivo = new Boolean(this.vivo);
		Element vivo = doc.createElement("Vivo");
		elemento.appendChild(vivo);
		vivo.setTextContent(valorVivo.toString());
	}
	
	protected void persistirUbicable(Document doc, Element elemento) {
		this.persistirUbicacion(doc, elemento);
		this.persistirVivo(doc, elemento);
	}
	
	
	protected static void recuperarUbicable(Element element, Ubicable ubicable) {
		recuperarPropios(element, ubicable);
	}
	
	
	private static void recuperarPropios(Element element, Ubicable ubicable) {
		boolean valorVivo = false;
		Coordenada posicion = new Coordenada(-1,-1);
		
		NodeList childs = element.getChildNodes();
		for (int i = 0; i < childs.getLength(); i++) {
			Node child = childs.item(i);
			if (child.getNodeName().equals("Coordenada")) {
				posicion = Coordenada.fromElement((Element) child);
			}
			else if (child.getNodeName().equals("Vivo")) {
				valorVivo = Boolean.parseBoolean(child.getTextContent());
			}
		}
	
		ubicable.vivo = valorVivo;
		ubicable.ubicacion = posicion;
		
	}
	
	
	
	
	


	
	
}
